package com.pine.generator.core;

import com.baomidou.mybatisplus.generator.config.po.TableField;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;

import java.util.Map;
import java.util.Objects;

@Data
@NoArgsConstructor
@AllArgsConstructor
@Accessors(chain = true)
@Builder(toBuilder = true)
public class Field {

    /**
     * 字段注释
     */
    private String comment;

    /**
     * 中文字段名，从注视中截取
     */
    private String nameCn;

    /**
     * 字段类型，例如 Date、Integer、Long
     */
    private String propertyType;

    /**
     * 数据库中的字段名，用于注解，如果是数据库关键字则会增加 `` 符号
     * 例如：id、`version`、`level`、update_time
     */
    private String columnName;

    /**
     * 字段名称，驼峰格式，首字母小写，例如 id、createTime、age、updateTime
     */
    private String propertyName;

    /**
     * 字段名称，首字母大写，例如 Id、CreateTime、Age、UpdateTime
     */
    private String capitalName;

    /**
     * 数据库原始字段名称，例如 id、create_time、age、update_time
     */
    private String name;

    /**
     * 是否主键
     */
    private boolean keyFlag;

    /**
     * 是否是 boolean 类型
     */
    private boolean isBoolean;

    /**
     * 是否是日期类型
     */
    private boolean isDate;

    /**
     * 是否是枚举类型
     */
    private boolean isEnum;

    /**
     * 是否是字符串类型
     */
    private boolean isString;

    /**
     * 是否为乐观锁字段
     */
    private boolean isVersionField;

    /**
     * 是否为逻辑删除字段
     */
    private boolean isLogicDeleteField;

    /**
     * 枚举类名
     */
    private String enumClassName;

    public static Field buildByTableField(TableField tableField) {
        Field field = new Field();
        field.setKeyFlag(tableField.isKeyFlag());
        field.setComment(tableField.getComment());
        field.setColumnName(tableField.getAnnotationColumnName());
        field.setVersionField(tableField.isVersionField());
        field.setLogicDeleteField(tableField.isLogicDeleteField());
        field.setPropertyType(tableField.getPropertyType());
        field.setPropertyName(tableField.getPropertyName());
        field.setCapitalName(tableField.getCapitalName());
        field.setName(tableField.getName());
        field.setBoolean(Objects.equals(field.getPropertyType().toUpperCase(), "BOOLEAN"));
        field.setDate(Objects.equals(field.getPropertyType().toUpperCase(), "DATE")
                || Objects.equals(field.getPropertyType().toUpperCase(), "TIMESTAMP")
                || Objects.equals(field.getPropertyType().toUpperCase(), "TIME")
                || Objects.equals(field.getPropertyType().toUpperCase(), "LOCALDATETIME"));
        field.setString(Objects.equals(field.getPropertyType().toUpperCase(), "STRING"));

        // 设置字段的中文名称
        field.setNameCn(field.getComment());
        String split = ":,";
        for (char c : split.toCharArray()) {
            int index = field.getComment().indexOf(c);
            if (index != -1) {
                field.setNameCn(field.getComment().substring(0, index));
                break;
            }
        }

        // 判断字段是否是枚举
        field.setEnum(tableField.getPropertyType().contains("Enum"));
        return field;
    }

    public static Field buildByTableFieldWithEnumMap(TableField tableField, Map<String, String> enumNameMap) {
        Field field = buildByTableField(tableField);
        String propertyName = tableField.getPropertyName();
        field.setEnum(enumNameMap.containsKey(propertyName));
        if (field.isEnum()) {
            field.setEnumClassName(enumNameMap.get(propertyName));
        }
        return field;
    }
}
